#include "RingQueue.hpp"
#include <cassert>
#include <cstdbool>
#include <unistd.h>

const int g_pro_thread_num=6;
const int g_con_thread_num=3;

void *Producer(void *args)
{
    assert(args!=nullptr);
    RingQueue<int> *prq=(RingQueue<int> *)args;

    int num=1;

    while(true)
    {
        // 1. 生产数据,需要消耗一定时间
        int x=num++;
        //usleep(999);

        // 2. 将生产的数据push到环形队列中
        prq->Push(x);
        std::cout<<"生产 : "<<x<<std::endl;
        //sleep(1);
    }
}

void *Consumer(void *args)
{
    assert(args!=nullptr);
    RingQueue<int> *prq=(RingQueue<int> *)args;

    while(true)
    {
        // 1. 先从环形队列获取数据
        int x=0;
        prq->Pop(&x);

        // 2. 再将从环形队列获取的数据进行消费
        std::cout<<"消费 : "<<x<<std::endl;
        //usleep(999);
        //sleep(1);
    }

}

int main(int,char**,char**)
{
    pthread_t proTid[g_pro_thread_num];
    pthread_t conTid[g_con_thread_num];

    // 创建环形队列
    RingQueue<int>* prq=new RingQueue<int>();

    // 创建多个生产者
    for(int i=0;i<g_pro_thread_num;++i)
    {
        pthread_create(proTid+i,nullptr,Producer,(void *)prq);
    }
    // 创建多个消费者
    for(int i=0;i<g_con_thread_num;++i)
    {
        pthread_create(conTid+i,nullptr,Consumer,(void *)prq);
    }

    // 等待多个生产者
    for(int i=0;i<g_pro_thread_num;++i)
    {
        pthread_join(proTid[i],nullptr);
    }
    // 等待多个消费者
    for(int i=0;i<g_con_thread_num;++i)
    {
        pthread_join(conTid[i],nullptr);
    }

    delete prq;

    std::cout<<"main exit"<<std::endl;

    return 0;
}

// int main(int,char**,char**)
// {
//     pthread_t proTid;
//     pthread_t conTid;

//     // 创建环形队列
//     RingQueue<int>* prq=new RingQueue<int>();

//     // 创建一个生产线程,一个消费线程
//     pthread_create(&proTid,nullptr,Producer,(void *)prq);
//     pthread_create(&conTid,nullptr,Consumer,(void *)prq);

//     // 进行线程等待
//     pthread_join(proTid,nullptr);
//     pthread_join(conTid,nullptr);

//     delete prq;

//     std::cout<<"main exit"<<std::endl;

//     return 0;
// }